import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
import { ElMessage, ElLoading } from 'element-plus'
import { getToken, removeToken } from './auth'
import { getApiBaseUrl, isDevelopment } from './env'
import router from '@/router'
import { ErrorHandler } from './errorHandler'

// 处理401错误的专用函数，使用全局错误处理器
function handle401Error() {
  ErrorHandler.handle401Error()
}

// 创建加载实例
let loadingInstance: any

// 创建 axios 实例
const service: AxiosInstance = axios.create({
  // 开发环境下不设置 baseURL，让代理处理；生产环境使用环境变量
  baseURL: isDevelopment() ? '' : getApiBaseUrl(), 
  timeout: 200000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 在请求头中添加 token
    const token = getToken()
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    
    // 获取全局开启加载动画配置
/*     if (import.meta.env.VITE_GLOBAL_SHOW_LOADING === 'true') {
      loadingInstance = ElLoading.service({
        lock: true,
        text: '加载中...',
        background: 'rgba(0, 0, 0, 0.7)'
      })
    } */
    
    // 开发环境下打印请求信息
    if (isDevelopment()) {
      console.log('请求配置:', config)
    }
    
    return config
  },
  (error) => {
    console.error('请求拦截器错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 关闭加载动画
    if (loadingInstance) {
      loadingInstance.close()
    }
    
    const res = response.data
    
    // 开发环境下打印响应数据
    if (isDevelopment()) {
      console.log('响应数据:', res)
    }
    
    // 根据后端约定的状态码进行处理
    // 假设后端返回的数据结构为 { code: number, data: any, message: string }
    // 如果响应没有code字段，说明可能是直接返回数据或者其他格式
    if (res && typeof res === 'object' && 'code' in res) {
      if (res.code !== 200 && res.code !== 0) {
        ElMessage({
          message: res.message || '请求失败',
          type: 'error',
          duration: 5 * 1000
        })
        
        // 处理特定错误码
        if (res.code === 401) {
          // 未授权，直接处理登出，不显示错误消息
          console.log('响应数据中检测到401状态码')
          handle401Error()
          return Promise.reject(new Error('未授权'))
        }
        
        return Promise.reject(new Error(res.message || '请求失败'))
      } else {
        return res.data || res
      }
    } else {
      // 直接返回响应数据（适用于一些API直接返回数据的情况）
      return res
    }
  },
  (error) => {
    // 关闭加载动画
    if (loadingInstance) {
      loadingInstance.close()
    }
    
    // 处理 HTTP 错误状态码
    let message = '请求失败'
    if (error.response) {
      const status = error.response.status
      console.error('HTTP 错误状态码:', status)

      switch (status) {
        case 400:
          message = '请求错误'
          break
        case 401:
          console.log('HTTP状态码401：未授权访问')
          // 如果是退出登录接口返回401，直接忽略
          if(error.request.responseURL.includes(import.meta.env.VITE_API_BASE_URL+import.meta.env.VITE_LOGOUT_URL)){
            console.log('退出登录接口返回401，忽略处理')
            return Promise.resolve()
          }
          // 检查是否已经在处理401错误
          if (sessionStorage.getItem('handling_401_error') === 'true') {
            console.log('正在处理401错误，跳过重复处理')
            return Promise.reject(new Error('未授权访问，请重新登录'))
          }
          // 处理401错误
          handle401Error()
          return Promise.reject(new Error('未授权访问，请重新登录'))
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = '请求地址出错'
          break
        case 408:
          message = '请求超时'
          break
        case 500:
          message = '服务器内部错误'
          break
        case 501:
          message = '服务未实现'
          break
        case 502:
          message = '网关错误'
          break
        case 503:
          message = '服务不可用'
          break
        case 504:
          message = '网关超时'
          break
        case 505:
          message = 'HTTP版本不受支持'
          break
        default:
          message = `未知错误(${status})`
      }
      if (error.response.data) {
        message = error.response.data.message
      }
    } else if (error.request) {
      message = '服务器未响应'
    } else {
      message = error.message
    }
    
    ElMessage({
      message: message,
      type: 'error',
      duration: 5 * 1000
    })
    error.message = message
    return Promise.reject(error)
  }
)

// 封装 GET 请求
export function get<T>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
  return service.get(url, { params, ...config })
}

// 封装 POST 请求
export function post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
  return service.post(url, data, config)
}

// 封装 PUT 请求
export function put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
  return service.put(url, data, config)
}

// 封装 DELETE 请求
export function del<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
  return service.delete(url, config)
}

// 导出 axios 实例
export default service
